package com.globefrog.framework.log.util;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import org.apache.commons.collections4.CollectionUtils;

/**
 * 集合工具类,Commons-Collections已经迁移到Commons-Collections4中, 这边只对自己需要的进行扩展.
 *
 * @author caijinbang
 * @date 2020-11-08 07:33
 */
public class CollectionExtUtil {

  /**
   * 转换Collection所有元素(通过toString())为String, 中间以 separator分隔.
   *
   * @param collection 集合
   * @param separator  分隔符
   * @return toString结果
   */
  public static String convertToString(final Collection collection, final String separator) {
    return StringExtUtil.join(collection, separator);
  }

  /**
   * 转换Collection所有元素toString(), 每个元素的前面加入prefix，后面加入postfix, 如<div>mymessage</div>.
   *
   * @param collection 集合
   * @param prefix     前缀
   * @param postfix    后缀
   * @return toString结果
   */
  public static String convertToString(final Collection collection, final String prefix,
      final String postfix) {
    StringBuilder builder = new StringBuilder();
    for (Object o : collection) {
      builder.append(prefix).append(o).append(postfix);
    }
    return builder.toString();
  }

  /**
   * 取得Collection的第一个元素，如果collection为空返回null.
   *
   * @param collection 集合
   * @param <T>        对象
   * @return 第一个对象
   */
  public static <T> T getFirst(Collection<T> collection) {
    if (CollectionUtils.isEmpty(collection)) {
      return null;
    }
    return collection.iterator().next();
  }

  /**
   * 获取Collection的最后一个元素 ，如果collection为空返回null.
   *
   * @param collection 集合
   * @param <T>        对象
   * @return 最后一个元素
   */
  public static <T> T getLast(Collection<T> collection) {
    if (CollectionUtils.isEmpty(collection)) {
      return null;
    }
    // 当类型为List时，直接取得最后一个元素 。
    if (collection instanceof List) {
      List<T> list = (List<T>) collection;
      return list.get(list.size() - 1);
    }
    // 其他类型通过iterator滚动到最后一个元素.
    Iterator<T> iterator = collection.iterator();
    while (true) {
      T current = iterator.next();
      if (!iterator.hasNext()) {
        return current;
      }
    }
  }

  /**
   * 清除Collection中的null元素.
   *
   * @param collection 需要清除null元素的Collection
   * @return 已经清除null元素的Collection
   */
  public static Collection<?> clearNullElement(Collection<?> collection) {
    if (collection != null) {
      collection.removeIf(Objects::isNull);
    }
    return collection;
  }

  /**
   * 清除Collection中的特定的元素.
   *
   * @param collection 需要清除特定元素的Collection
   * @param element    需要被清除的特定元素
   * @return 已经清除特定元素的Collection
   */
  public static Collection<?> clearElement(Collection<?> collection, Object element) {
    if ((collection != null) && (element != null)) {
      collection.removeIf(o -> o.equals(element));
    }
    return collection;
  }
}
